
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1e6 + 10;
vector <int> edges[N];
queue <int> q;
int fa[N], dis[N];
int dfs(int u)
{
	int ret = 0;
	for (auto v : edges[u])
	{
		ret = max(ret,dfs(v));
	}
	return ret + 1;
}
int bfs()
{
	int ret = 0;
	q.push(1);
	while (q.size())
	{
		int sz = q.size();
		ret = max(ret, sz);
		while (sz--)
		{
			int t = q.front();q.pop();
			for (auto v : edges[t])
			{
				q.push(v);
			}
		}
	}
	return ret;
}
int main()
{
	int n;cin >> n;
	for (int i = 1; i < n; i++)
	{
		int a, b;cin >> a >> b;
		edges[a].push_back(b);
		fa[b] = a;
	}
	cout << dfs(1) << endl;
	cout << bfs() << endl;
	int x, y;cin >> x >> y;
	while (x != 1)
	{
		dis[fa[x]] = dis[x] + 1;
		x = fa[x];
	}
	int len = 0;
	while (y != 1 && dis[y] == 0)
	{
		len++;
		y = fa[y];
	}
	cout << dis[y] * 2 + len << endl;
}
//#include<iostream>
//#include<vector>
//#include<algorithm>
//#include<queue>
//using namespace std;
//const int N = 1e6 + 10;
//int fa[N], dist[N];
//vector<int> tree[N];
//queue<int> q;
//int dfs(int u)
//{
//	int ret = 0;
//	for (auto v : tree[u])
//	{
//		ret = max(ret, dfs(v));
//	}
//	return ret + 1;
//}
//int bfs(int u)
//{
//	int ret = 0;
//	q.push(1);
//	while (q.size())
//	{
//		int sz = q.size();
//		ret = max(ret, sz);
//		while (sz--)
//		{
//			int m = q.front();q.pop();
//			for (int v : tree[m])
//			{
//				q.push(v);
//			}
//		}
//	}
//	return ret;
//}
//int main()
//{
//	int n,a,b; cin >> n;
//	for (int i = 1; i < n; i++)
//	{
//		cin >> a >> b;
//		tree[a].push_back(b);
//		fa[b] = a;
//	}
//	int x, y; cin >> x >> y;
//	cout << dfs(1) << endl;
//	cout << bfs(1) << endl;
//	while (x != 1)
//	{
//		dist[fa[x]] = dist[x] + 1;
//		x = fa[x];
//	}
//	int len = 0;
//	while (y != 1 && dist[y] == 0)
//	{
//		y = fa[y];
//		len++;
//	}
//	cout << dist[y] * 2 + len << endl;
//	return 0;
//}